导航菜单
首页 >  EXCEL VBAデータを並べ替えるSortメソッド  > ExcelのVBAを使用してデータをソートする方法

ExcelのVBAを使用してデータをソートする方法

VBAにおけるソートは、データをある基準に従って並び替える処理です。VBAでは、データ構造をソートすることができます。ここでは、データをソートする方法について説明します。

VBAにおけるデータの並び替え複数条件4つ以上の複数条件ユーザー定義での検索テーブルのソート優先順位 VBAにおけるデータの並び替え

VBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRangeオブジェクトを使用する方法があります。Rangeオブジェクトは、Excelのセル範囲を表し、Sortメソッドを使用することで、セル範囲のデータをソートすることができます。

Rangeオブジェクトを使用してデータをソートするには、以下の手順を実行します。

Rangeオブジェクトを作成し、ソートする範囲を指定する。Sortメソッドを使用して、ソート条件を指定する。ソートされたデータを使用して、必要に応じて処理を行う。

以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。

123456789101112131415161718192021Sub sortRange()    Dim ws As Worksheet    Set ws = ActiveSheet        'ソート対象のセル範囲を指定する    Dim sortRange As Range    Set sortRange = ws.Range("A1:B5")        '昇順でソートする    sortRange.Sort key1:=sortRange.Columns(1), _                    order1:=xlAscending, _                    header:=xlNo, _                    Orientation:=xlSortColumns        'ソートされたデータを使用して、必要な処理を行う    '例えば、ソートされたデータをメッセージボックスに表示する    Dim cell As Range    For Each cell In sortRange        MsgBox cell.Value    Next cellEnd Sub

VBAにおけるデータの並び替えには、ExcelオブジェクトモデルのRangeオブジェクトを使用する方法があります。Rangeオブジェクトは、Excelのセル範囲を表し、Sortメソッドを使用することで、セル範囲のデータをソートすることができます。

Rangeオブジェクトを使用してデータをソートするには、以下の手順を実行します。

Rangeオブジェクトを作成し、ソートする範囲を指定する。Sortメソッドを使用して、ソート条件を指定する。ソートされたデータを使用して、必要に応じて処理を行う。

以下は、例として、Excelのシート上のセル範囲を昇順でソートするサンプルコードです。

Visual Basic12345678910111213141516171819202122vbCopy codeSub sortRange()    Dim ws As Worksheet    Set ws = ActiveSheet        'ソート対象のセル範囲を指定する    Dim sortRange As Range    Set sortRange = ws.Range("A1:B5")        '昇順でソートする    sortRange.Sort key1:=sortRange.Columns(1), _                    order1:=xlAscending, _                    header:=xlNo, _                    Orientation:=xlSortColumns        'ソートされたデータを使用して、必要な処理を行う    '例えば、ソートされたデータをメッセージボックスに表示する    Dim cell As Range    For Each cell In sortRange        MsgBox cell.Value    Next cellEnd Sub 

このコードでは、Range("A1:B5")で指定されたセル範囲を昇順でソートし、ソートされたデータをメッセージボックスに表示しています。

Sortメソッドの引数には、key1やorder1など、複数のソート条件を指定することもできます。また、Sortメソッドは、昇順・降順のほか、カスタムソートや複数列のソートなど、様々なソート条件を指定することができます。

複数条件

「VBAソート」と調べると、複数条件という言葉が出てきます。複数条件に関する疑問について解決してきましょう。

VBAにおいて、Excelシート上のセル範囲のデータを複数の条件でソートする場合、key1やorder1などの引数に複数の条件を指定することができます。以下は、例として、Excelのシート上のセル範囲を、A列を昇順、B列を降順でソートするサンプルコードです。

1234567891011121314151617181920212223Sub sortRangeMultiple()    Dim ws As Worksheet    Set ws = ActiveSheet        'ソート対象のセル範囲を指定する    Dim sortRange As Range    Set sortRange = ws.Range("A1:B5")        '複数条件でソートする    sortRange.Sort key1:=sortRange.Columns(1), _                    order1:=xlAscending, _                    key2:=sortRange.Columns(2), _                    order2:=xlDescending, _                    header:=xlNo, _                    Orientation:=xlSortColumns        'ソートされたデータを使用して、必要な処理を行う    '例えば、ソートされたデータをメッセージボックスに表示する    Dim cell As Range    For Each cell In sortRange        MsgBox cell.Value    Next cellEnd Sub

このコードでは、Range("A1:B5")で指定されたセル範囲を、A列を昇順、B列を降順でソートし、ソートされたデータをメッセージボックスに表示しています。

Sortメソッドの引数には、key1やorder1のように、複数の条件を指定することができます。key1やorder1は、1番目のソート条件を指定し、key2やorder2は、2番目のソート条件を指定します。同様に、key3やorder3を指定することで、3番目以降のソート条件を指定することもできます。

以上が、VBAにおけるExcelシート上のセル範囲の複数条件によるソート方法です。

4つ以上の複数条件

VBAにおいて、Excelシート上のセル範囲を4つ以上の条件でソートする場合、key1、order1、key2、order2、key3、order3、…のように、keyとorderを交互に指定することで、任意の数の条件でソートすることができます。

以下は、例として、Excelのシート上のセル範囲を、A列を昇順、B列を降順、C列を昇順、D列を降順でソートするサンプルコードです。

123456789101112131415161718192021222324252627Sub sortRangeMultiple()    Dim ws As Worksheet    Set ws = ActiveSheet        'ソート対象のセル範囲を指定する    Dim sortRange As Range    Set sortRange = ws.Range("A1:D5")        '複数条件でソートする    sortRange.Sort key1:=sortRange.Columns(1), _                    order1:=xlAscending, _                    key2:=sortRange.Columns(2), _                    order2:=xlDescending, _                    key3:=sortRange.Columns(3), _                    order3:=xlAscending, _                    key4:=sortRange.Columns(4), _                    order4:=xlDescending, _                    header:=xlNo, _                    Orientation:=xlSortColumns        'ソートされたデータを使用して、必要な処理を行う    '例えば、ソートされたデータをメッセージボックスに表示する    Dim cell As Range    For Each cell In sortRange        MsgBox cell.Value    Next cellEnd Sub

このコードでは、Range("A1:D5")で指定されたセル範囲を、A列を昇順、B列を降順、C列を昇順、D列を降順でソートし、ソートされたデータをメッセージボックスに表示しています。

Sortメソッドの引数には、key1やorder1のように、複数の条件を指定することができます。同様に、key2やorder2、key3やorder3、key4やorder4を指定することで、任意の数の条件でソートすることができます。

ユーザー定義での検索

VBAにおいて、Excelシート上のセル範囲をユーザー定義の複数条件でソートする場合は、SortFieldsコレクションを使用することができます。

以下は、例として、Excelのシート上のセル範囲を、ユーザーが指定した2つの列を昇順でソートするサンプルコードです。

1234567891011121314151617181920212223242526272829303132333435363738394041424344Sub sortRangeCustom()    Dim ws As Worksheet    Set ws = ActiveSheet        'ソート対象のセル範囲を指定する    Dim sortRange As Range    Set sortRange = ws.Range("A1:B5")        'ユーザーからの入力で、ソート対象の列と昇順/降順を指定する    Dim sortColumns As Variant    sortColumns = Application.InputBox("ソートする列を指定してください。例: A:D", Type:=2)        Dim sortOrder As Variant    sortOrder = Application.InputBox("昇順でソートする場合はTrue、降順でソートする場合はFalseを指定してください。", Type:=4)        'SortFieldsコレクションを使用して、複数条件でソートする    Dim sortFields As SortFields    Set sortFields = sortRange.Sort.SortFields        Dim i As Integer    For i = LBound(sortColumns) To UBound(sortColumns)        Dim sortColumn As String        sortColumn = sortColumns(i)        Dim sortField As SortField        Set sortField = sortFields.Add(sortRange.Columns(sortColumn), xlSortOnValues, xlAscending)        sortField.SortOnValue.Color = RGB(255, 0, 0)        sortField.SortOnValue.TintAndShade = 0        sortField.SortOnValue.PatternTintAndShade = 0        sortField.Header.SortKey = sortRange.Columns(sortColumn).Cells(1, 1).Value        sortField.Header.SortOrder = sortOrder        sortField.Header.SortOrientation = xlSortColumnThenRow        sortField.IncludeHeader = True    Next i        'ソートを実行する    sortRange.Sort.Apply        'ソートされたデータを使用して、必要な処理を行う    '例えば、ソートされたデータをメッセージボックスに表示する    Dim cell As Range    For Each cell In sortRange        MsgBox cell.Value    Next cellEnd Sub

このコードでは、InputBox関数を使用して、ユーザーから2つの列と昇順/降順を入力してもらい、SortFieldsコレクションを使用して、ユーザーが入力した条件でソートを行っています。ソートされたデータをメッセージボックスに表示する部分は、前の例と同様です。

SortFieldsコレクションは、ソート対象の範囲に対して、複数のソート条件を設定することができます。

テーブルのソート

VBAを使用して、Excelテーブルを複数条件でソートする方法について説明します。以下のコードは、名前と年齢の2つの条件でExcelテーブルをソートする例です。

1234567891011121314Sub sort_table()    Dim tbl As ListObject    Set tbl = ActiveSheet.ListObjects("Table1") ' "Table1"を自分のテーブル名に変更する     With tbl.Sort        .SortFields.Clear        .SortFields.Add Key:=tbl.ListColumns("Name").Range, _            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal        .SortFields.Add Key:=tbl.ListColumns("Age").Range, _            SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal        .Header = xlYes        .Apply    End WithEnd Sub

上記のコードでは、tbl.Sortメソッドを使用してテーブルをソートしています。.SortFields.Addメソッドを使用して、ソートするキーを指定し、xlAscendingまたはxlDescendingで昇順または降順を指定します。複数の条件をソートする場合は、SortFields.Addメソッドを複数回使用して条件を追加することができます。

上記の例では、名前で昇順にソートし、名前が同じ場合は年齢で降順にソートしています。

また、tbl.ListColumnsプロパティを使用して、ソートする列を指定することもできます。上記の例では、名前と年齢の列を指定しています。

上記のコードを実行すると、指定した複数の条件でExcelテーブルがソートされます。

優先順位

VBAで複数の条件でデータをソートする場合、優先順位は.SortFields.Addメソッドで指定した順序に従います。

つまり、最初に.SortFields.Addメソッドで指定した条件が最優先であり、それ以降に指定された条件は順に優先順位が下がっていきます。

例えば、以下のコードを考えてみましょう。

12345678910111213141516Sub sort_table()    Dim tbl As ListObject    Set tbl = ActiveSheet.ListObjects("Table1")     With tbl.Sort        .SortFields.Clear        .SortFields.Add Key:=tbl.ListColumns("Name").Range, _            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal        .SortFields.Add Key:=tbl.ListColumns("Age").Range, _            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal        .SortFields.Add Key:=tbl.ListColumns("Joining Year").Range, _            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal        .Header = xlYes        .Apply    End WithEnd Sub

例えば、以下のようなデータがある場合、

NameAgeJoining YearJohn302010John252012Kate282011

上記のコードを実行すると、以下のようにソートされます。

NameAgeJoining YearJohn252012John302010Kate282011

つまり、まずは名前がソートされ、名前が同じ場合は年齢でソートされ、年齢も同じ場合は入社年数でソートされるため、年齢の異なるJohnが、年齢の若い方が先に表示されることになります。

相关推荐: